package main

import (
	"fmt"
	"sync"
	"time"
)

func main() {
	// test_sync()
	test_channel()
}

func test_channel() {
	var ch = make(chan string, 10) // 创建大小为 10 的缓冲信道
	download := func(url string) {
		fmt.Println("start to download", url)
		time.Sleep(time.Second * 2)
		ch <- url // 将 url 发送给信道
	}

	for i := 0; i < 3; i++ {
		go download("a.com/" + string(i+'0'))
	}
	for i := 0; i < 3; i++ {
		msg := <-ch // 等待信道返回消息。
		fmt.Println("finish", msg)
	}
	fmt.Println("Done!")
}

func test_sync() {
	var wg sync.WaitGroup
	// wg.Add(1)：为 wg 添加一个计数，wg.Done()，减去一个计数。
	// go download()：启动新的协程并发执行 download 函数。
	// wg.Wait()：等待所有的协程执行结束。
	download := func(url string) {
		defer wg.Done()
		fmt.Println("start to download", url)
		time.Sleep(time.Second) // 模拟耗时操作
		// wg.Done()               // 完成一个任务
	}
	for i := 0; i < 3; i++ {
		wg.Add(1)
		go download("a.com/" + string(i+'0'))
	}
	wg.Wait()
	fmt.Println("Done!")
}
